import { delay, ok } from './utils.js'


function getDaysInMonth(dateStr) {
    // 解析输入的年份和月份
    const [year, month] = dateStr.split('-').map(num => parseInt(num, 10));

    // 计算该月的第一天
    let currentDate = new Date(+new Date(year, month - 1, 1) + 8 * 3600 * 1000);
    // 准备一个数组来存放结果
    const days = [];

    // 当月份仍然是输入的月份时，循环运行
    while (currentDate.getMonth() === month - 1) {
        // 将当前日期格式化为 YYYY-MM-DD 并添加到数组中
        days.push(currentDate.toISOString().split('T')[0].replace(year + '-', ''));
        // 移动到下一天
        currentDate.setDate(currentDate.getDate() + 1);
    }

    return days;
}

function generateSortedRandomArray(length, maxValue = 10000000,isSort=true) {
    let array = [];

    // 检查参数是否有效
    if (length < 1 || maxValue < 1) {
        return array;
    }

    // 生成随机数组
    while (array.length < length) {
        let randomValue = Math.ceil(Math.random() * maxValue);
        array.push(randomValue);
    }

    // 排序数组并返回
    return isSort?array.sort((a, b) => a - b):array;
}

function formatDate(dateObject, formatString) {
    // 因数年（YYYY）、月（MM）、日（DD）、小时（HH）、分钟（mm）、秒（ss）
    const padZero = num => num < 10 ? '0' + num : num.toString();

    // 构建日期部分
    const year = dateObject.getFullYear();
    const month = padZero(dateObject.getMonth() + 1); // 月份是从0开始的
    const day = padZero(dateObject.getDate());

    // 构建时间部分
    const hours = padZero(dateObject.getHours());
    const minutes = padZero(dateObject.getMinutes());
    const seconds = padZero(dateObject.getSeconds());

    // 替换格式字符串的标识符
    return formatString
        .replace('YYYY', year)
        .replace('MM', month)
        .replace('DD', day)
        .replace('HH', hours)
        .replace('mm', minutes)
        .replace('ss', seconds);
}

function getDaysInQuarter(startDateStr) {
    // 解析输入的起始日期
    const startDate = new Date(startDateStr);

    // 根据起始月份计算季度的最后一个月
    const startMonth = startDate.getMonth();
    const endMonth = startMonth + 2;

    // 季度的最后一天为下个季度的第0天
    const endDate = new Date(startDate.getFullYear(), endMonth + 1, 1);

    // 用来收集所有日期的数组
    const days = [];

    // 当前日期
    let currentDate = new Date(startDateStr);

    // 循环直到结束日期
    while (currentDate <= endDate) {
        days.push(formatDate(currentDate, "MM-DD"));
        // 移动到下一天
        currentDate.setDate(currentDate.getDate() + 1);
    }

    return days;
}

function getMonthsFromStartToEndOfYear(startDateStr) {
    // 解析输入的起始日期
    const [startYear, startMonth,] = startDateStr.split('-').map(num => parseInt(num, 10));

    // 开始月份直到12月
    const months = [];

    // 添加从开始月份到12月的所有月份到数组
    for (let month = startMonth; month <= 12; month++) {
        // Format month correctly (MM format)
        const formattedMonth = month < 10 ? `0${month}` : `${month}`;
        // 添加年份和格式化后的月份到数组
        months.push(`${startYear}-${formattedMonth}`);
    }

    return months;
}

export default async function (req) {
    await delay(100)

    const {
        dateType,
        category,
        date
    } = req.body;

    let yData = [];
    let xData = [];

    // 累计图
    if (category === 1) {

        if (dateType === "month") {
            xData = getDaysInMonth(date)
        }

        if (dateType === "quarter") {
            xData = getDaysInQuarter(date)
        }

        if (dateType === "year") {
            xData = getMonthsFromStartToEndOfYear(date)
        }

        yData = generateSortedRandomArray(xData.length)

    }

    if(category === 2) {
        if (dateType === "day") {
            xData = getDaysInMonth(date[0])
        }

        if (dateType === "week") {
            xData = [
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
                '第一周（01-07至01-07）',
            ]
        }

        if (dateType === "month") {
            xData = getMonthsFromStartToEndOfYear(date[0])
        }

        yData = generateSortedRandomArray(xData.length,10000000,false)
    }

    return ok({
        yData,
        xData
    })
}